package session;

import entity.Utente;
import entity.Wish;
import java.security.Security;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;
import javax.ejb.Stateless;

/**
 * Gestisce la trasmissione di e-mail dal sito agli utenti destinatari.
 * 
 * @author Rachid Ouchary, Fabio Strocco, Max Passaghe, Marco Tansini.
 */
@Stateless
public class MailUtil implements MailUtilRemote {
    private static String mailhost = "smtp.gmail.com";

    /**
     * Invia un e-mail all'indirizzo di posta specificato come parametro.
     * @param subject l'oggetto dell'e-mail.
     * @param body il corpo dell'e-mail, cio&egrave il messaggio.
     * @param sender l'indirizzo del mittente.
     * @param recipients l'indirizzo del destinatario.
     */
    public void sendMail(String subject, String body, String sender, String recipients) {
        try {
            Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
            Properties props = new Properties();
            props.setProperty("mail.transport.protocol", "smtp");
            props.setProperty("mail.host", mailhost);
            props.put("mail.smtp.auth", "true");
            props.put("mail.smtp.port", "465");
            props.put("mail.smtp.socketFactory.port", "465");
            props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
            props.put("mail.smtp.socketFactory.fallback", "false");
            props.setProperty("mail.smtp.quitwait", "false");
            Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication("fabiostrocco@gmail.com", "1q2w3e!Q");
                }
            });
            MimeMessage message = new MimeMessage(session);
            message.setSender(new InternetAddress(sender));
            message.setSubject(subject);
            message.setContent(body, "text/plain");
            if (recipients.indexOf(',') > 0) {
                message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients));
            } else {
                message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients));
            }

            MailSender mailSender = new MailSender(message);
            mailSender.start();
        } catch (MessagingException ex) {
            Logger.getLogger(MailUtil.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Invia un e-mail all'utente appena registrato, per confermare la sua
     * registrazione.
     *
     * @param user l'utente a cui notificare l'avvenuta registrazione.
     */
    public void sendRegistrationMail(Utente user) {
        String body = "La informiamo che l'autenticazione sul sito \n e' avvenuta con successo.\n\n\n" +
                      "- Username: " + user.getUsername() + "\n" +
                      "- Password: " + user.getPassword() + "\n" +
                      "- Nome: " + user.getNome() + "\n" +
                      "- Cognome: " + user.getCognome() + "\n" +
                      (user.getCitta() == null ?
                       "" : "- Citta': " + user.getCitta() + "\n")+
                      (user.getProfessione() == null ?
                       "" : "- Professione: " + user.getProfessione() + "\n") + "\n" +
                      "La informiamo che potra' cambiare i suoi dati personali a suo piacimento\n" +
                      "tramite il nostro sito.\n" +
                      "Grazie di aver scelto WishLister.";
        sendMail("Conferma avvenuta registrazione su WishLister", body,
                 "WishLister", user.getMail());
    }

    /**
     * Invia un e-mail all'utente appena aggiunto, per confermare la sua
     * registrazione.
     *
     * @param mittente l'utente che ha effettuato l'aggiunta.
     * @param destinatario l'utente a cui notificare l'avvenuta aggiunta.
     */
    public void sendFriendMail(Utente mittente, Utente destinatario) {
        String body = "Notifica dal sito WishList\n\n" +
                      "La informiamo che lei e' stato aggiunto " +
                      " come amico dall'utente " + mittente.getNome() + " " + mittente.getCognome() +
                      ".";
        sendMail("Notifica aggiunta amicizia", body,
                 "WishLister", destinatario.getMail());
    }

    /**
     * Invia un e-mail all'utente che ha espresso il desiderio che si &egrave
     * prenotato.
     *
     * @param wish il desiderio espresso.
     */
    public void sendPrenotazioneMail(Wish wish) {
        String body = "La informiamo che un utente ha prenotato il desiderio: " +
                      wish.getItem().getDescrizione() + " da lei espresso.";
        sendMail("Notifica prenotazione desiderio", body,
                 "WishLister", wish.getUtente().getMail());
    }

    // <editor-fold defaultstate="collapsed" desc="Nested class Mail Sender">
    private class MailSender extends Thread {
        private MimeMessage message;

        public MailSender(MimeMessage message) {
            this.message = message;
        }

        @Override
        public void run() {
            try {
                Transport.send(message);
            } catch (MessagingException ex) {
                Logger.getLogger(MailUtil.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    //</editor-fold>
}
